package admin

import (
	"OrgManager/app/models"
	"OrgManager/library/response"
	"database/sql"
	"github.com/gogf/gf/os/glog"
	"sort"

	"github.com/gogf/gf/frame/g"
	"github.com/gogf/gf/net/ghttp"
)

type BaseController struct {
}

func init() {
	var c = &BaseController{} // 用户模块 路由注册 - 使用执行对象注册方式
	group := g.Server().Group("/admin/base")
	group.ALL("/show/{tableName}!all.bu", c.TableDataList)
	group.ALL("/{id}/show/{tableName}!id.bu", c.GetTableDataById)
	group.ALL("/{pid}/show/{tableName}!children.bu", c.GetTableChildrenDataByPid)
	group.ALL("/edit/{tableName}.bu", c.TableDataSave)
}

// 通用获取表数据列表方法
func (c *BaseController) TableDataList(r *ghttp.Request) {
	tableName := r.GetString("tableName")
	if tableName != "" {
		result, err := g.DB().Table(tableName).All()
		if err == nil {
			// 没错，而且有数据返回
			glog.Infof("读取到数据了：%v \r\n", result)
			response.Json(r, 1, "数据读取成功", result)
		} else if err == sql.ErrNoRows {
			// 读取不到数据
			glog.Infof("读取成功，但读取不到数据了！ \r\n")
			response.Json(r, 0, "数据为空", result)
		} else {
			// 出错了
			glog.Error("错误:%v \r\n", err)
			response.Json(r, -1, "数据读取失败", err.Error())
		}
	} else {
		response.Json(r, -2, "数据读取失败，参数异常！", nil)
	}
}

// 通用根据ID获取数据方法
func (c *BaseController) GetTableDataById(r *ghttp.Request) {
	tableName := r.GetString("tableName")
	id := r.GetInt("id", 0)
	if tableName != "" && id > 0 {
		result, err := g.DB().Table(tableName).Where("id", id).One()
		if err == nil {
			glog.Infof("读取到数据了：%v \r\n", result)
			response.Json(r, 1, "数据读取成功", result)
		} else if err == sql.ErrNoRows {
			glog.Infof("读取成功，但读取不到数据了！ \r\n")
			response.Json(r, 0, "数据为空", result)
		} else {
			glog.Error("错误:%v \r\n", err)
			response.Json(r, -1, "数据读取失败", err.Error())
		}
	} else {
		response.Json(r, -2, "数据读取失败", nil)
	}
}

// 根据PID获取下级组织机构数据
func (c *BaseController) GetTableChildrenDataByPid(r *ghttp.Request) {
	tableName := r.GetString("tableName")
	pid := r.GetInt("pid", 0)
	result, err := g.DB().Table(tableName).Where("pid = ? and status > -1", pid).Select()

	if err == nil {
		// 如果错误等于空

		// 整理数据
		data := models.Data{}
		for _, value := range result {
			m := value.ToMap()
			if value["pid"].Int() == 0 {
				m["hasChildren"] = true
			}
			data = append(data, m)
		}

		// 对数据进行排序
		sort.Sort(data)  // 根据字段 sort 高 - 低 排序

		response.Json(r, 1, "数据读取成功", data)
	} else if err == sql.ErrNoRows {
		// 如果读取不到数据
		response.Json(r, 0, "数据为空", result)
	} else {
		// 如果出错了
		glog.Error("错误:%v \r\n", err)
		response.Json(r, -1, "系统忙，请稍后再试！", err.Error())
	}
}

// 通用修改数据方法
func (c *BaseController) TableDataSave(r *ghttp.Request) {
	tableName := r.GetString("tableName")
	data, _ := r.GetJson()
	glog.Infof("读取到的数据:%v \r\n", data.ToMap())
	if tableName != "" {
		if _, exists := data.ToMap()["id"]; exists {
			result, err := g.DB().Table(tableName).Data(data.ToMap()).Where("id = ?", data.GetInt("id")).Update()
			if err == nil || err == sql.ErrNoRows {
				glog.Infof("数据操作结果：%v \r\n", result)
				response.Json(r, 1, "操作成功", result)
			} else {
				glog.Error("错误:%v \r\n", err)
				response.Json(r, -1, "系统忙，请稍后再试！", err.Error())
			}
		} else {
			result, err := g.DB().Table(tableName).Data(data.ToMap()).Insert()
			if err == nil || err == sql.ErrNoRows {
				glog.Infof("数据操作结果：%v \r\n", result)
				response.Json(r, 1, "操作成功", result)
			} else {
				glog.Error("错误:%v \r\n", err)
				response.Json(r, -1, "系统忙，请稍后再试！", err.Error())
			}
		}
	} else {
		response.Json(r, -2, "操作失败，缺少必要的参数！", nil)
	}

}
